package org.zhangchao.poi.util;

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

/**
 * Date类型和String转换工具类
 * 
 * @author ZhangChao
 * 
 */
public class DateUtil {

	/** 存放不同的日期模板格式的SimpleDateFormat的Map */
	private static Map<String, ThreadLocal<SimpleDateFormat>> simpleDateFormatMap = new HashMap<String, ThreadLocal<SimpleDateFormat>>();
	
	/** 默认 转换 的格式 */
	private static final String DEFAULT_PATTERN = "yyyy-mm-dd";

	/**
	 * 每个线程会使用独立的SimpleDateFormat
	 * @param pattern
	 * @return
	 */
	private static DateFormat getDateFormat(final String pattern) {
		ThreadLocal<SimpleDateFormat> tl = simpleDateFormatMap.get(pattern);
		// 只有Map中还没有这个pattern的SimpleDateFormat才会生成新的,并放入map
		if (null == tl) {
			tl = new ThreadLocal<SimpleDateFormat>() {
				@Override
				protected SimpleDateFormat initialValue() {
					//System.out.println("thread: " + Thread.currentThread() + " init pattern: " + pattern);
					return new SimpleDateFormat(pattern);
				}
			};
			simpleDateFormatMap.put(pattern, tl);
		}
		return tl.get();
	}

	/**
	 * 把Data转成字符串表示
	 * @param date
	 * @param pattern
	 * @return
	 */
	public static String format(Date date, String pattern) {
		if(null == pattern || "".equals(pattern)) {
			pattern = DEFAULT_PATTERN;
		}
		return getDateFormat(pattern).format(date);
	}
	
	/**
	 * 把Data转成字符串表示
	 * @param date
	 * @return
	 */
	public static String format(Date date) {
		return getDateFormat(DEFAULT_PATTERN).format(date);
	}

	/**
	 * 把字符串转成Date
	 * @param dateStr
	 * @param pattern
	 * @return
	 * @throws ParseException
	 */
	public static Date parse(String dateStr, String pattern)
			throws ParseException {
		if(null == pattern || "".equals(pattern)) {
			pattern = DEFAULT_PATTERN;
		}
		return getDateFormat(pattern).parse(dateStr);
	}
	
	/**
	 * 把字符串转成Date
	 * @param dateStr
	 * @return
	 * @throws ParseException
	 */
	public static Date parse(String dateStr)
			throws ParseException {
		return getDateFormat(DEFAULT_PATTERN).parse(dateStr);
	}

}
